// 1.2.2.数组-相关-指向数组的指针
/**
 * C++ 支持数组数据结构，它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据，但它往往被认为是一系列相同类型的变量。
 * 数组的声明并不是声明一个个单独的变量，比如 number0、number1、...、number99，而是声明一个数组变量，比如 numbers，然后使用 numbers[0]、numbers[1]、...、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
 * 所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素，最高的地址对应最后一个元素。
 * -----------------
 * 相关
 * 
 * 在 C++ 中，数组是非常重要的，我们需要了解更多有关数组的细节。下面列出了 C++ 程序员必须清楚的一些与数组相关的重要概念
 * 1.多维数组
 *  C++ 支持多维数组。多维数组最简单的形式是二维数组。
 * 2.指向数组的指针
 *  您可以通过指定不带索引的数组名称来生成一个指向数组中第一个元素的指针。
 * 3.传递数组给函数
 *  您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。
 * 4.从函数返回数组
 *  C++ 允许从函数返回数组。
 * 
 * ~~~~~~~~~~~~~~~~~~
 * 指向数组的指针
 * 数组名是指向数组中第一个元素的常量指针。因此，在下面的声明中：
 * 
 *    double runoobAarray[50];
 * 
 * runoobAarray 是一个指向 &runoobAarray[0] 的指针，即数组 runoobAarray 的第一个元素的地址。因此，下面的程序片段把 p 赋值为 runoobAarray 的第一个元素的地址：
 * 
 *  double *p;
    double runoobAarray[10];
    p = runoobAarray;
 *

 * 使用数组名作为常量指针是合法的，反之亦然。因此，*(runoobAarray + 4) 是一种访问 runoobAarray[4] 数据的合法方式。
 * 一旦您把第一个元素的地址存储在 p 中，您就可以使用 *p、*(p+1)、*(p+2) 等来访问数组元素。下面的实例演示了上面讨论到的这些概念：
 * 
 * 
 *
*/

#include <iostream>
#include <iomanip>

int main(void)
{
  int arr[5] = {1, 2, 3, 4, 5};
  int *p;
  // p = arr;
  p = &arr[0];

  std::cout << "*p : " << *p << std::endl; // 1 数组的第一个元素

  double arr_d[5] = {2.1, 3.2, 4.3, 5.4, 6.5};
  double *ptr;
  ptr = arr_d;

  // 使用指针
  for (int i = 0; i < 5; i++)
  {
    std::cout << "*(ptr+" << i << ") : " << *(ptr + i) << std::endl;
  }
  // 使用数组变量名
  for (int i = 0; i < 5; i++)
  {
    std::cout << "*(arr_d+" << i << ") : " << *(arr_d + i) << std::endl;
  }
  // 在上面的实例中，p 是一个指向 double 型的指针，这意味着它可以存储一个 double 类型的变量。一旦我们有了 p 中的地址，*p 将给出存储在 p 中相应地址的值，正如上面实例中所演示的。

  return 0;
}